﻿using System;
using System.Collections.Generic;
using System.Drawing;
using System.Linq;
using System.Text;

namespace TreinamentoNDDigital.Lab2.Model
{
    public class Game
    {
        public List<Enemy> Enemies;
        public Weapon WeaponInRoom;
        private Player player;

        /// <summary>
        /// Retorna a Posição do jogador
        /// </summary>
        public Point PlayerLocation { get { return player.Location; } }

        /// <summary>
        /// Retorna a Vida do jogador
        /// </summary>
        public int PlayerHitPoints { get { return player.HitPoints; } }

        /// <summary>
        /// Retorna uma Lista de Nomes das armas do Jogador
        /// </summary>
        public List<string> PlayerWeapons { get { return player.Weapons; } }

        private int level = 0;

        /// <summary>
        /// Retorna o nivel do Jogo
        /// </summary>
        public int Level { get { return level; } }

        private Rectangle boundaries;

        /// <summary>
        /// Retorna o retangulo da Masmorra, onde tudo acontece.
        /// </summary>
        public Rectangle Boundaries { get { return boundaries; } }

        /// <summary>
        /// Constroi o jogo, já com o espaço da masmorra.
        /// </summary>
        /// <param name="boundaries"></param>
        public Game(Rectangle boundaries)
        {
            this.boundaries = boundaries;
            player = new Player(this, new Point(boundaries.Left + 10, boundaries.Top + 70), boundaries);
        }

        /// <summary>
        /// Metodo responsável por mover o Jogador e os Inimigos.
        /// </summary>
        /// <param name="direction">Direção do movimento do Jogador</param>
        /// <param name="random">Random para movimentar os Inimigos aleatoriamente.</param>
        public void Move(Direction direction, Random random)
        {
            player.Move(direction);
            foreach (Enemy enemy in Enemies)
            {
                enemy.Move(random);
            }
        }

        /// <summary>
        /// Responsável por definir a arma do Jogador.
        /// </summary>
        /// <param name="weaponName">Nome da arma.</param>
        public void Equip(string weaponName)
        {
            player.Equip(weaponName);
        }

        /// <summary>
        /// Método responsável por verificar se o Jogador possuir a arma no inventario.
        /// É utilizado para garantir que não sejam adicionadas armas iguais no jogo.
        /// </summary>
        /// <param name="weaponName">Nome da arma para verificação</param>
        /// <returns>Verdadeiro caso possua.</returns>
        public bool CheckPlayerInventory(string weaponName)
        {
            return player.Weapons.Contains(weaponName);
        }

        public void HitPlayer(int maxDamage, Random random)
        {
            player.Hit(maxDamage, random);
        }

        /// <summary>
        /// Método responsável por adicionar vida ao Jogador, quando tomar uma poção.
        /// </summary>
        /// <param name="health">Quantidade de maxima de vida</param>
        /// <param name="random">Utilizado para definir a quantidade de vida ganha.</param>
        public void IncreasePlayerHealth(int health, Random random)
        {
            player.IncreaseHealth(health, random);
        }

        /// <summary>
        /// Método responsável pelo ataque do jogador.
        /// Chama o método player.Attack();
        /// </summary>
        /// <param name="direction">Direção do ataque</param>
        /// <param name="random"></param>
        public void Attack(Direction direction, Random random)
        {
            player.Attack(direction, random);
        }

        /// <summary>
        /// Método responsável por retornar uma posição aleatoria dentro da masmorra.
        /// </summary>
        /// <param name="random"></param>
        /// <returns>Um objeto Point.</returns>
        private Point GetRandomLocation(Random random)
        {
            return new Point(boundaries.Left +
                random.Next(boundaries.Right / 10 - boundaries.Left / 10) * 10,
                boundaries.Top +
                random.Next(boundaries.Bottom / 10 - boundaries.Top / 10) * 10);
        }

        /// <summary>
        /// Método responsavel pela definição dos niveis do Jogo.
        /// Defini aleatoriamente a posição dos inimigos e Armas dentro da Masmorra.
        /// </summary>
        /// <param name="random"></param>
        public void NewLevel(Random random)
        {
            level++;
            switch (level)
            {
                case 1:
                    Enemies = new List<Enemy>();
                    Enemies.Add(new Bat(this, GetRandomLocation(random), boundaries));
                    WeaponInRoom = new Sword(this, GetRandomLocation(random));
                    break;
            }
        }
    }
}